<?php 
namespace SimplePhp\System;

/**
* 自动载入核心文件
* 使用的是惰性加载
* 如果要注册一个新的module就要注册一个register
*/
class AutoLoad
{
	private static $file;
	private static $registerArr;
	private function __construct(){}
	public static function IniAutoLoad(File &$File){
		self::$file=$File;
		spl_autoload_register("\SimplePhp\System\AutoLoad::defaultAutoload",true);
	}
	/**
	 * 添加注册函数
	 * @param  [type] $key  [description]
	 * @param  [type] $func [description]
	 * @return [type]       [description]
	 */
	public static function registerAutoload($key,$func){
		self::$registerArr[$key]=$func;
		spl_autoload_register($func,true,FALSE);
	}
	/**
	 * 解除注册函数
	 * @param  [type] $key [description]
	 * @return [type]      [description]
	 */
	public static function unregisterAutoload($key){
		spl_autoload_unregister(self::$registerArr[$key]);
	}
	/**
	 * 解析自动载入传入的类名
	 * 就是new ****()中的***
	 * @param  [type] $classname [description]
	 * @return [type]            [description]
	 */
	public static function autoloadCalssResolve($classname){
		preg_match_all("([\w]+)", $classname,$match);
		$countMatch=count($match[0]);
		$namespace=DIRECTORY_SEPARATOR;//命名空间
		$classname='';//类名
		for ($i=0; $i < $countMatch; $i++) { 
			if($countMatch-1>$i){
				$namespace.=$match[0][$i].DIRECTORY_SEPARATOR;
			}else{
				$classname.=$match[0][$i];
			}
		}
		return [$namespace,$classname];
	}
	/**
	 * 默认自动载入方法
	 * @param  [type] $classname [description]
	 * @return [type]            [description]
	 */
	public static function defaultAutoload($classname){
		$resolve=AutoLoad::autoloadCalssResolve($classname);
		$classname=$resolve[1];
		$namespace=$resolve[0];
		// var_dump($resolve);
		$fielDrive=self::$file;
		if(empty($fielDrive)){
			throw new \Exception("文件夹遍历驱动不存在", 1);exit;
		}
		$fileList=$fielDrive->autoloadFileMap;
		// var_dump($fileList);exit;
		unset($fileList['test.php']);//剔除测试程序
		$fileListKeys=array_keys($fileList);
		$Ext=[".class.php",".interface.php",".enum.php",".node.php"];
		foreach ($Ext as $key => $value) {
			$classFileName=$classname.$value;
			$haseFile=array_search($classFileName, $fileListKeys);
			if($haseFile!==false){
				break;
			}
		}
		if($haseFile===false){
			return;
		}
		$requireFile=$fileList[$fileListKeys[$haseFile]];
		if(is_array($requireFile)){
			foreach ($requireFile as $key => $value) {
				require_once($value);
			}
		}else{
			require_once($requireFile);
		}
	}
}